package jin.si.com.reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * @description:
 * @ClassName TestController
 * @Author MT
 * @Date 2021/6/30 9:18
 **/
public class TestController {

    /*
    * 通过反射获取类的内容
    * 反射：在运行期间动态的获取Class对象的内容
    */
    public static void main(String[] args) throws Exception {

        /*//1、获取Class对象（不常用）
        User u= new User();
        Class<? extends User> c = u.getClass();
        System.out.println(c);

        //2、获取Class对象（不经常使用）
        Class<User> c1=User.class;
        System.out.println(c1);*/

        //3、获取Class对象（开发常用）
        Class<?> c3 = Class.forName("jin.si.com.reflect.User");
        System.out.println(c3);

        /*//方案一获取实例对象
        User u = (User) c3.newInstance();
        System.out.println(u);

        User u1 = (User) c3.newInstance();
        System.out.println(u1);

        System.out.println("*****************");

        //方案二获取实例对象 getConstructor构造器
        Constructor<?> con = c3.getConstructor();
        User u2 = (User) con.newInstance();
        System.out.println(u2);

        Constructor<?> con1 = c3.getConstructor(int.class, String.class);
        User u3 = (User) con1.newInstance(20,"12345");
        System.out.println(u3);
        System.out.println("***********************************");


        //获取私有的构造器对象
        Constructor<?> con2 = c3.getDeclaredConstructor(String.class);
        con2.setAccessible(true); // //允许暴力访问  默认是false
        User u4 = (User) con2.newInstance("小明");


       System.out.println("***********************************");


        //获取所以公共的构造器
        Constructor<?>[] cons = c3.getConstructors();
        for(Constructor cons_1:cons){
            System.out.println(cons_1);
        }
        System.out.println("***********************************");

        //获取所有的构造器
        Constructor<?>[] cons1 = c3.getDeclaredConstructors();
        for(Constructor cons_2:cons1){
            System.out.println(cons_2);
        }

        System.out.println("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&");


        //获取公共的成员变量
        Field[] fields=c3.getFields();
        for(Field f:fields){
            System.out.println(f);
        }
        System.out.println("******************");

        //获取所有的属性变量
        Field[] fields1 = c3.getDeclaredFields();
        for(Field f:fields1){
            System.out.println(f);
        }
        System.out.println("******************");*/

        /*//获取指定变量的内容等
        Field f = c3.getField("name");
        String name = f.getName();      //获取字段名字
        Class<?> type = f.getType();    //获取字段类型
        System.out.println(name);
        System.out.println(type);

        //获取字段的值
        Object o = c3.newInstance();
        String n = (String) f.get(o);
        System.out.println(n+"******");

        System.out.println("******************");

         //获取私有的变量成员
        Field field = c3.getDeclaredField("age");
        //允许暴力访问
        field.setAccessible(true);
        field.set(o,100);           //赋值
        Object o1 = field.get(o);
        System.out.println(o1);


        System.out.println("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%");

        //获取所有公共的成员方法
	    Method[] m1 = c3.getMethods();
	    for (Method mm : m1) {
		    System.out.println(mm);
	    }

        //获取所有的方法
        Method[] method1=c3.getDeclaredMethods();
        for(Method m:method1){
            System.out.println(m);
        }

        //获取公共的有参或者无参方法对象 invoke调用对象
        Method play = c3.getMethod("play");
        Object invoke = play.invoke(o);

        Method method = c3.getMethod("sum",int.class,int.class);
        Object re = method.invoke(o, 100, 300);
        System.out.println(re);

        //获取私有的方法
        Method eat = c3.getDeclaredMethod("eat");
        eat.setAccessible(true);
        eat.invoke(o);*/

    }
    







}


